<?php
/**
 * POSCMS框架文件
 * 二次开发时请勿修改本文件
 * 四川迅睿云软件开发有限公司 www.xunruicms.com
 */
	
class Check extends M_Controller {

	private $step;
	private $_upfile;

	/**
     * 系统体检
     */
    public function index() {
        $this->step = array(
            '_dir_write' => '目录可写权限',
            '_template_theme' => '模板和风格命名',
            '_url_fopen' => '远程获取数据',
            '_curl_init' => 'Curl函数',
            '_fsockopen' => '远程访问服务',
             '_php' => 'PHP版本',
            '_mysql' => '数据库版本',
            '_email' => '邮箱服务',
            '_tableinfo' => '数据表结构',
            '_unzip' => '解压函数',
            '_category' => '栏目数量检查',
            '_openssl_open' => 'OpenSSL功能',
            '_ini_get' => 'ini函数',
            '_upload' => '文件上传',
            '_domain' => '域名绑定',
            '_attachment_unused' => '未使用的附件',
            '_database' => '数据库检测',
            '_webpath' => '根目录文件安全',
             '_category_dir' => '栏目重复验证',
            '_lang' => '语言包文件',
             '_table_counts' => '数据压力',
             '_mobile_domain' => '手机域名检测',
        );
		$this->template->assign(array(
			'step' => $this->step,
            'action' => 'index',
		));
		$this->template->display('check_index.html');exit;
	}

    /**
     * 安全检测
     */
    public function safe() {
        $this->step = array(
            '_safe_admin_file' => '重命名后台入口文件',
            '_safe_diy' => '分离diy目录',
            '_safe_uploadfile' => '分离uploadfile目录',
            '_safe_cache' => '分离cache目录',
            '_safe_web' => '分析web目录权限',
        );
        $this->template->assign(array(
            'step' => $this->step,
            'action' => 'safe',
        ));
        $this->template->display('check_index.html');exit;
    }

    private function _safe_cache() {
        if (strpos(CACHEPATH, WEBPATH) === 0) {
            $this->halt('必须将cache目录移动到web目录之外的地方，<a href="http://help.poscms.net/2711.html" target="_blank">查看教程</a>', 0);
        }
        $this->halt('安全', 1);
    }

    private function _safe_uploadfile() {
        if (strpos(SYS_ATTACHMENT_URL, SITE_PC) === 0 ) {
            $this->halt('必须将uploadfile目录移动到web目录之外的地方，<a href="http://help.poscms.net/2589.html" target="_blank">查看教程</a>', 0);
        }
        if (!file_put_contents(SYS_UPLOAD_PATH.'/test.php', '<?php echo "poscms";')) {
            $this->halt('上传目录['.SYS_UPLOAD_PATH.']无法写入文件', 0);
        }
        $url = SYS_ATTACHMENT_URL.'test.php';
        if (!function_exists('stream_context_create')) {
            $this->halt('函数没有被启用：stream_context_create', 0);
        }
        $context = stream_context_create(array(
            'http' => array(
                'timeout' => 5 //超时时间，单位为秒
            )
        ));
        $code = file_get_contents($url, 0, $context);
        if ($code == '<?php echo "poscms";') {
            $this->halt('安全', 1);
        } elseif ($code == 'poscms') {
            $this->halt('不安全，建议附件域名使用纯静态网站', 1);
        } else {
            $this->halt('附件域名绑定异常，无法访问：'.$url.'，可以尝试手动访问此地址，<br>如果提示<？php echo "poscms";就表示成功，<a href="http://help.poscms.net/2589.html" target="_blank">查看教程</a>', 0);
        }
    }

    private function _safe_diy() {
        if (is_dir(WEBPATH.'diy/')) {
            $this->halt('请必须分离diy目录名称，<a href="http://help.poscms.net/2700.html" target="_blank">查看教程</a>', 0);
        }
        if (strpos(FCPATH, WEBPATH) === 0) {
            $this->halt('建议将diy目录移动到web目录之外的地方，<a href="http://help.poscms.net/2700.html" target="_blank">查看教程</a>', 1);
        }
        $this->halt('安全', 1);
    }

    private function _safe_admin_file() {
        if (SELF == 'admin.php') {
           $this->halt('如果管理帐号泄漏，后台容易遭受攻击，请必须修改根目录admin.php的文件名', 0);
        }
        $this->halt('安全', 1);
    }

    private function _safe_web() {
        if (file_put_contents(WEBPATH.'test_poscms.php', '<?php echo "test_poscms";')) {
            unlink(WEBPATH.'test_poscms.php');
            $this->halt('目录['.WEBPATH.']建议赋予只读权限，Linux555权限', 1);
        } else {
            $this->halt('安全', 1);
        }
    }

	/**
     * PHP环境
     */
    public function phpinfo() {
		phpinfo();
		$this->output->enable_profiler(TRUE);
	}
	
	/**
     * 执行检测
     */
    public function todo() {
		$step = $this->input->get('step');
		if ( method_exists($this, $step)) {
			echo @call_user_func_array(array($this, $step), array());
            $this->halt('完成', 1);
		} else {
            $this->halt('未定义的操作：'.$step, 0);
        }
	}


	/**
     * 语言包
     */
    private function _lang() {

        $url = SITE_URL.'config/language/'.SITE_LANGUAGE.'/lang.js';
        $size = file_get_contents($url);
        if (strlen($size) < 10) {
            return $this->halt('语言包JS文件异常：'.$url, 0);
        }

	}

	// 手机域名检测
    private function _mobile_domain() {

        if ($this->site_info[SITE_ID]['SITE_MURL']) {
            $url = SITE_MURL.'api.php';
            if (!function_exists('stream_context_create')) {
                $this->halt('函数没有被启用：stream_context_create', 0);
            }
            $context = stream_context_create(array(
                'http' => array(
                    'timeout' => 5 //超时时间，单位为秒
                )
            ));
            $code = file_get_contents($url, 0, $context);
            if ($code == 'poscms ok') {
                return $this->halt('手机域名绑定成功', 1);
            } else {
                return $this->halt('手机域名绑定异常，无法访问：'.$url.'，可以尝试手动访问此地址，如果提示poscms ok就表示成功', 0);
            }
        } else {
            return $this->halt('当前站点没有绑定手机域名', 1);
        }

    }

    // 多站栏目重复判断
    private function _category_dir() {

        if (dr_count($this->site_info) == 1) {
            return;
        }

        $category = array();
        foreach ($this->site_info as $siteid =>$t) {
            $cat = $this->get_cache('module-'.$siteid.'-share', 'category');
            $category[$siteid] = array();
            if ($cat) {
                foreach ($cat as $t) {
                    if ($t['dirname']) {
                        $category[$siteid][] = $t['dirname'];
                    }
                }
            }
        }

        // 判断重复
        if ($category) {
            $site = $this->site_info;
            $mcat = $category[1];
            unset($site[1]);

            foreach ($site as $siteid =>$t) {
                $cat = $category[$siteid];
                $jj = array_intersect($cat, $mcat);
                if ($jj) {
                    return $this->halt('多站点间存在重复目录的栏目会影响静态生成页面（站点['.$siteid.']栏目'.implode('和', $jj).'）', 0);
                }
                $mcat = $cat;
            }
        }

        return $this->halt('共享栏目重复性检查完毕', 1);
    }

    private function _webpath() {

        $local = dr_file_map(WEBPATH, 1); // 搜索根目录
        foreach ($local as $file) {
            $ext = strtolower(substr(strrchr($file, '.'), 1));
            if (in_array($ext, array('zip', 'rar', 'sql'))) {
                return $this->halt('文件不安全【/'.$file.'】请及时清理', 0);
            }
            $size = file_get_contents(WEBPATH.$file, 0, null, 0, 9286630);
            if (strlen($size) >= 9286630) {
                return $this->halt('存在大文件文件【/'.$file.'】请及时清理', 0);
            }
        }

        return $this->halt('网站文件安全性检查完成', 1);

    }

    // 未使用的附件
    private function _attachment_unused() {

        if ($this->db->count_all_results('attachment_unused') > 15) {
            return $this->halt("<a style='color:blue' href=".dr_url('attachment/unused').">系统存在大量未使用的附件，请及时清理无用附件，累计越多程序执行速度越慢。</a>", 0);
        }

    }
	
	/**
     * 上传参数检测
     */
    private function _upload() {

        $post = intval(@ini_get("post_max_size"));
        $file = intval(@ini_get("upload_max_filesize"));

        $str = '';
        if ($file >= $post) {
            $str.= $this->halt('系统配置不合理，post_max_size值必须大于upload_max_filesize值，否则会出现“进度条100%卡住”或者提示“游客不允许上传”', 0);
        }
        if ($file < 10) {
            $str.= $this->halt('系统环境只允许上传'.$file.'MB文件，可以设置upload_max_filesize值提升上传大小', 1);
        }
        if ($post < 10) {
            $str.= $this->halt('系统环境要求每次发布内容不能超过'.$post.'MB（含文件），可以设置post_max_size值提升发布大小', 1);
        }

        return $str;
	}

	/**
     * ini_get
     */
    private function _ini_get() {
		if (!function_exists('ini_get')) {
			return $this->halt('系统函数ini_get被禁用了，将无法获取到系统环境参数，解决方案：在php.ini中找到disable_functions并去掉ini_get', 0);
		}
	}

	/**
     * 模板名称检测
     */
    private function _template() {

	}

	// 数据压力
    private function _table_counts() {

        $rt = array();
        $module = $this->db->where('disabled', 0)->get('module')->result_array();
        if ($module) {
            foreach ($module as $data) {
                $dirname = $data['dirname'];
                $data['site'] = dr_string2array($data['site']);
                $form = $this->db->where('module', $dirname)->get('module_form')->result_array();
                foreach ($this->site_info as $siteid => $t) {
                    if (isset($data['site'][$siteid]['use']) && $data['site'][$siteid]['use']) {
                        $r = $this->_check_table_counts($siteid.'_'.$dirname, $dirname.'模块主表');
                        if ($r) {
                            $rt[] = $r;
                        }
                        if ($form) {
                            foreach ($form as $mm) {
                                $r = $this->_check_table_counts($siteid.'_'.$dirname.'_form_'.$mm['table'], $dirname.'模块'.$mm['name'].'表');
                                if ($r) {
                                    $rt[] = $r;
                                }
                            }
                        }
                    }
                }
            }
        }

        foreach ($this->site_info as $siteid => $t) {
            $form = $this->db->get($siteid.'_form')->result_array();
            if ($form) {
                foreach ($form as $mm) {
                    $r = $this->_check_table_counts($siteid.'_form_'.$mm['table'], $mm['name'].'表');
                    if ($r) {
                        $rt[] = $r;
                    }
                }
            }
        }

        if ($rt) {
            return implode('', $rt);
        }

        return $this->halt('检查数据库负载情况正常', 1);
    }

    private function _check_table_counts($table, $name) {
        $counts = $this->db->count_all_results($table);
        if ($counts > 100000) {
            return $this->halt('数据表('.$name.'/'.$this->db->dbprefix($table).')数据量超过10万，会影响加载速度，建议对其进行数据优化', 0);
        }
    }


	/**
     * 解压函数检测
     */
    private function _unzip() {
		if (!function_exists('gzopen')) {
			return $this->halt('未开启zlib扩展，您将无法进行在线升级、无法下载模块/应用、无法进行模块/应用升级更新、无法上传头像，解决方案：Google/百度一下“PHP开启zlib扩展”', 0);
		}
		if (!function_exists('gzinflate')) {
			return $this->halt('函数gzinflate被禁用了，您将无法进行在线升级、无法下载模块/应用、无法进行模块/应用升级更新、无法上传头像，解决方案：在php.ini中找到disable_functions并去掉gzinflate', 0);
		}
	}
	
	/**
     * 目录是否可写
     */
    private function _dir_write() {
	
		$dir = array(
            CACHEPATH.'' => '无法生成系统缓存文件',
            WEBPATH.'config/' => '无法生成系统配置文件',
            CACHEPATH.'config/domain.php' => '无法生成系统配置文件',
            WEBPATH.'config/rewrite.php' => '无法生成伪静态配置文件',
            CACHEPATH.'config/site/' => '无法生成网站配置文件',
            CACHEPATH.'config/site/1.php' => '无法生成网站配置文件',
            CACHEPATH.'data/' => '无法生成系统配置文件，会导致系统配置无效',
            CACHEPATH.'templates/' => '无法生成模板解析文件',
            CACHEPATH.'session/' => '无法生成session会话文件',
            CACHEPATH.'errorlog/' => '无法保存错误日志',
            CACHEPATH.'cron/' => '无法执行任务计划',
            CACHEPATH.'index/' => '无法生成首页静态页面',
            CACHEPATH.'file/' => '无法存储文件缓存内容',
            CACHEPATH.'optionlog/' => '无法存储操作日志',
			SYS_UPLOAD_PATH.'/' => '无法上传附件',
		);

        if (function_exists('ini_get')) {
            $path = ini_get('upload_tmp_dir');
            if ($path) {
                $path = rtrim($path, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR;
                if (is_dir($path)) {
                    $dir[$path] =  '无法上传头像或者无法上传文件';
                }
            }
        }


        $local = dr_dir_map(FCPATH, 1); // 本地模块
        if ($local) {
            foreach ($local as $mdir) {
                if (is_file(APPSPATH.$mdir.'/config/module.php')) {
                    $dir[APPSPATH.$mdir.'/config/'] = '无法生成模块【'.$dir.'】配置文件';
                }
            }
        }
        $local = dr_dir_map(WEBPATH.'api/pay/', 1); // 支付接口
        if ($local) {
            foreach ($local as $mdir) {
                if (is_file(WEBPATH.'api/pay/'.$mdir.'/config.php')) {
                    $dir[WEBPATH.'api/pay/'.$mdir.'/config.php'] = '无法生成支付接口【'.$mdir.'】配置文件';
                }
            }
        }

		$str = '';
		foreach ($dir as $file => $note) {
            if (!$this->_check_write_able($file)) {
                $str.= $this->halt(str_replace(FCPATH, '/', $file).'无写入权限，'.$note, 0);
            }
            if (!file_exists($file)) {
                $str.= $this->halt(str_replace(FCPATH, '/', $file).'不存在，'.$note, 0);
            }
		}
		
		return $str;
	}
	
	/**
     * 栏目数量检查
     */
    private function _category() {
		$module = $this->get_module(SITE_ID);
		if ($module) {
			$string = '';
			foreach ($module as $t) {
				if (dr_count($t['category']) > 300) {
					$string.= $this->halt("当前站点模块【{$t[name]}】的栏目超过了300个，内存消耗会比较多，栏目数量建议控制在300个以内", 0);
				}
			}
		}
		return $string;
	}

    /**
     * 域名绑定检测
     */
    private function _domain() {

        $ip = $this->_get_server_ip();
        $string = '';
        $domain = $name = array();
        $member = $this->get_cache('member');

        // 检测域名重复性和可用性
        foreach ($this->site_info as $sid => $site) {
            // 站点域名
            if ($site['SITE_DOMAIN']) {
                $name[] = '站点【'.$site['SITE_NAME'].'】主域名';
                $domain[] = $site['SITE_DOMAIN'];
            }
            // 站点其他域名
            if ($site['SITE_DOMAINS']) {
                $arr = @explode(',', $site['SITE_DOMAINS']);
                if ($arr) {
                    foreach ($arr as $a) {
                        if ($a) {
                            $name[] = '站点【'.$site['SITE_NAME'].'】其他域名';
                            $domain[] = $a;
                        }
                    }
                }
            }
            // 站点移动端域名
            if ($site['SITE_MOBILE']) {
                $name[] = '站点【'.$site['SITE_NAME'].'】移动端域名';
                $domain[] = $site['SITE_MOBILE'];
            }
            // 当前站点的所属模块
            $module = $this->get_module($sid);
            if ($module) {
                foreach ($module as $m) {
                    foreach ($m['site'] as $t) {
                        if ($t['domain']) {
                            $name[] = '模块【'.$m['name'].'】在站点【'.$site['SITE_NAME'].'】中的域名';
                            $domain[] = $t['domain'];
                        }
                    }
                }
                unset($module);
            }
            // 当前站点的会员中心域名
            if ($member['setting']['domain'][$sid]) {
                $name[] = '会员中心在站点【'.$site['SITE_NAME'].'】中的域名';
                $domain[] = $member['setting']['domain'][$sid];
            }

        }
        // 空间搜索页面的域名
        if ($member['setting']['space']['domain']) {
            $name[] = '空间页面的域名';
            $domain[] = $member['setting']['space']['domain'];
        }

        // 判断域名是否重复
        $repeat = @array_diff_assoc($domain, @array_unique($domain));
        if ($repeat) {
            foreach ($repeat as $i => $v) {
                foreach ($domain as $id => $d) {
                    if ($v == $d) {
                        $string.= $this->halt("域名【{$v}】与{$name[$id]}相同，请更换...", 0);
                    }
                }
            }
        }

        return $string;
    }
	
	/**
     * 风格与模板是否重名
     */
    private function _template_theme() {
		if (SITE_TEMPLATE == SITE_THEME) {
			return $this->halt('模板和风格目录同名可能导致模板被下载，建议模板和风格使用不相同的目录名称', 0);
		}
        if (SITE_TEMPLATE == 'default') {
            return $this->halt('网站模板【default】未更换，建议正式站点不要采用系统默认模板【default】，默认模板仅用于学习', 0);
        }
	}
	
	/**
     * Cookie安全码验证
     */
    private function _cookie_code() {
		if (SYS_KEY == 'finecms') {
			return $this->halt("请重新生成安全密钥，否则网站数据有被盗的风险，解决方案：系统-配置-生成密钥", 0);
		}
	}
	
	/**
     * allow_url_fopen
     */
    private function _url_fopen() {
		if (!ini_get('allow_url_fopen')) {
			return $this->halt('远程图片无法保存、网络图片无法上传、一键登录无法登录、无法访问云商店、无法使用微信。解决方案：在php.ini文件中allow_url_fopen设置为On', 0);
		}
	}
	
	/**
     * curl_init
     */
    private function _curl_init() {
		if (!function_exists('curl_init')) {
			return $this->halt('PHP不支持CURL扩展，一键登录可能无法登录、无法访问云商店、无法使用微信。解决方案：将php.ini中的;extension=php_curl.dll中的分号去掉', 0);
		}
	}

	/**
     * openssl_open
     */
    private function _openssl_open() {
		if (!function_exists('openssl_open')) {
			return $this->halt('PHP不支持openssl，一键登录可能无法登录、无法访问云商店、无法使用微信。解决方案：将php.ini中的;extension=php_openssl.dll中的分号去掉', 0);
		}
	}
	
	/**
     * fsockopen
     */
    private function _fsockopen() {
		if (!function_exists('fsockopen')) {
			return $this->halt('PHP不支持fsockopen，可能充值接口无法使用、手机短信无法发送、电子邮件无法发送、一键登录无法登录、无法访问云商店、无法使用微信', 0);
		}
	}
	
	/**
     * php
     */
    private function _php() {
	
		if (version_compare(PHP_VERSION, '5.2.8', '<')) {
			return $this->halt('您的当前PHP版本是'.PHP_VERSION.'，会导致某些功能无法正常使用，建议PHP版本在5.3.0以上，最低支持5.2.8', 0);
		}
		
		if (version_compare(PHP_VERSION, '5.3.0', '<')) {
			return $this->halt('您的当前PHP版本是'.PHP_VERSION.'，建议PHP版本在5.3.0以上，性能会大大提高', 1);
		}
	}
	
	/**
     * mysql
     */
    private function _mysql() {
		if ($this->db->dbdriver == 'mysql') {
			return $this->halt("建议将数据库驱动设置为 mysqli 或 pdo ，设置方式：config/database.php中的dbdriver选项", 1);
		}
	}


	/**
     * email
     */
    private function _email() {
		if (!$this->db->count_all_results($this->db->dbprefix('mail_smtp'))) {
			return $this->halt("邮件服务器尚未设置，可能系统无法发送邮件通知，设置方式：系统->系统功能->邮件系统->添加SMTP服务器", 0);
		}
	}


	/**
     * mcryp
     */
    private function _ctype() {
		if (!function_exists('ctype_alnum')) {
			return $this->halt('PHP未开启Ctype扩展，无法正常发布内容，并且系统安全系数降低', 0);
		}
	}
	
	/**
     * 表结构检测
     */
    private function _tableinfo() {
	
		$sql = "SHOW TABLE STATUS FROM `{$this->db->database}`";
		$table = $this->db->query($sql)->result_array();
		if (!$table) {
            return $this->halt("无法通过( $sql )获取到数据表结构，系统模块无法使用，解决方案：为Mysql账号开启SHOW TABLE STATUS权限", 0);
        }
		
		$sql = 'SHOW FULL COLUMNS FROM `'.$this->db->dbprefix('admin').'`';
		$field = $this->db->query($sql)->result_array();
		if (!$field) {
            return $this->halt("无法通过( $sql )获取到数据表字段结构，系统模块无法使用，解决方案：为Mysql账号开启SHOW FULL COLUMNS权限", 0);
        }
	}
	


	// 升级文件说明
	public function upfile() {

        $dir = dr_safe_filename($_GET['mid']);
        $name = urldecode($_GET['file']);
        $file = APPSPATH.$dir.'/'.$name;
        $this->template->assign('file', $file);

        if (!in_array($name, $this->_upfile)) {
            exit('文件['.$file.']异常，请联系官方技术');
        }

        $offset = array_search($name, $this->_upfile);
        $this->template->display('upfile/'.$offset.'.html');exit;
    }

	/**
     * 检测结果
     */
    private function _result() {
		return $this->halt('系统检查完成', 1);
	}

	/**
     * 数据库结构
     */
    private function _database() {


        // 删除老版本索引字段
        foreach (array(SITE_ID.'_share_index', SITE_ID.'_share_extend_index') as $table) {
            $field = $this->db->list_fields($table);
            if ($field) {
                foreach ($field as $t) {
                    !in_array($t, array('id', 'mid'))
                    && $this->db->query('ALTER TABLE `'.$this->db->dbprefix($table).'` DROP `'.$t.'`;');
                }
            }
        }

        // 纠正栏目自定义字段
        $this->db->query('UPDATE `'.$this->db->dbprefix('field').'` SET `relatedid` = 1 WHERE `relatedid`=0 AND `relatedname` LIKE \'category-%\'');

        // 扩大菜单标识
        $this->db->query('ALTER TABLE `'.$this->db->dbprefix('admin_menu').'` CHANGE `mark` `mark` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT \'菜单标识\';');

        $module = $this->db->where('disabled', 0)->get('module')->result_array();
        if ($module) {
            foreach ($module as $data) {
                $dirname = $data['dirname'];
                $data['site'] = dr_string2array($data['site']);
                foreach ($this->site_info as $siteid => $t) {
                    if (isset($data['site'][$siteid]['use']) && $data['site'][$siteid]['use']) {
                        // 兼容性处理，安装评论功能
                        \Poscms\Service::M('comment');
                        if (!$this->db->query("SHOW TABLES LIKE '".$this->db->dbprefix.$siteid.'_'.$dirname."_comment'")->row_array()) {
                            $this->comment_model->module($dirname);
                            $this->comment_model->install_sql($siteid);
                            if ($data['extend']
                                && !$this->db->query("SHOW TABLES LIKE '".$this->db->dbprefix.$siteid.'_'.$dirname."_extend_comment'")->row_array()) {
                                $this->comment_model->extend($dirname);
                                $this->comment_model->install_sql($siteid);
                            }
                        }
                        // 模块回收表结构
                        $table = $this->db->dbprefix.$siteid.'_'.$dirname."_recycle";
                        if (!$this->db->query("SHOW TABLES LIKE '".$table."'")->row_array()) {
                            $this->db->query("
			CREATE TABLE IF NOT EXISTS `{$table}` (
			  `id` int(10) unsigned NOT NULL,
			  `catid` smallint(5) unsigned NOT NULL COMMENT '栏目id',
			  `content` mediumtext NOT NULL COMMENT '具体内容',
			  `inputtime` int(10) unsigned NOT NULL COMMENT '删除时间',
			  PRIMARY KEY `id` (`id`),
			  KEY `catid` (`catid`),
			  KEY `inputtime` (`inputtime`)
			) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='回收站表';");
                        }
                    }
                }


            }
        }

        foreach ($this->site_info as $siteid => $t) {
            $form = $this->db->get($siteid.'_form')->result_array();
            if ($form) {
                \Poscms\Service::M('form');
                foreach ($form as $t) {
                    $this->form_model->create_file($t);
                }
            }
        }

        $form = $this->db->get('module_form')->result_array();
        if ($form) {
            \Poscms\Service::M('mform');
            foreach ($form as $t) {
                $this->mform_model->create_file($t['module'], $t);
            }
        }

        $this->db->query(trim("CREATE TABLE IF NOT EXISTS `".$this->db->dbprefix."member_notice` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `type` tinyint(1) unsigned NOT NULL COMMENT '类型',
  `uid` mediumint(8) unsigned NOT NULL COMMENT '通知者uid',
  `username` varchar(50) NOT NULL COMMENT '通知者',
  `isnew` tinyint(1) unsigned NOT NULL COMMENT '新提醒',
  `content` text NOT NULL COMMENT '通知内容',
  `inputtime` int(10) unsigned NOT NULL COMMENT '提交时间',
  PRIMARY KEY (`id`),
  KEY (`isnew`),
  KEY `type` (`type`,`uid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='会员通知提醒表';"));


        // 3.5 升级时的检测
        $app = array();
        $local = dr_dir_map(WEBPATH.'diy/app/', 1); // 搜索本地模块
        if ($local) {
            foreach ($local as $dir) {
                $path = WEBPATH.'diy/app/'.$dir.'/';
                if (is_file($path.'config/module.php') && is_file($path.'core/M_Controller.php')) {
                    $code = file_get_contents($path.'core/M_Controller.php');
                    if (strpos($code, 'branch/fqb/D_Module') !== false) {
                        $this->halt('【重要错误】模块['.$dir.']：请安装手册http://help.poscms.net/2683.html中的（7、自定义模块升级）继续操作', 0);
                    }
                } elseif (is_file($path.'config/app.php') && is_file($path.'core/M_Controller.php')) {
                    $code = file_get_contents($path.'core/M_Controller.php');
                    if (strpos($code, 'branch/fqb/D_App') !== false) {
                        $app[] = $dir;
                    }
                } elseif ($dir == 'space') {
                    $code = file_get_contents($path.'core/M_Controller.php');
                    if (strpos($code, 'branch/fqb/D_Common') !== false) {
                        $this->halt('【重要错误】：下载空间space插件，并覆盖到网站中，http://help.poscms.net/2703.html', 0);
                    }
                }
            }
        }

        if ($app) {
            $this->halt('【重要错误】这些插件必须做兼容升级：'.implode('、', $app), 0);
        }

        return $this->halt('检查数据库结构', 1);
	}
	
	/**
     * 消息提示
     */
	private function halt($msg, $status = 1) {
	    if ($status) {
	        echo "<font color=green>".$msg."</font>";
        } else {
	        echo "<font color=red>".$msg."</font>";
        }
        exit;
	}
}